package main

import (
	"fmt"
	"net/http"
)

type Routable interface {
	Route(method string, pattern string, handlerFunc func(ctx *Context))
}

type MyHandler interface {
	http.Handler
	Routable
}

//定义一个Handler结构体
type Handlers struct {
	//字段handlers 是一个map
	//map的key是由method+path组成的字符串 如GET/signUp
	//map的value是一个与path对应的方法 如signUp()
	handlers map[string]func(c *Context)
}

//实现ServeHTTP方法 用于路由查找匹配
//如果找到对应路由 则执行相应方法 如未找到 返回404
func (h *Handlers) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
	//调用辅助方法 将method和path组合成key
	key := h.Key(request.Method, request.URL.Path)
	//查找key是否存在 存在执行对应方法 否则返回404
	if handler, ok := h.handlers[key]; ok {
		ctx := NewContext(writer, request)
		handler(ctx)
	} else {
		writer.WriteHeader(http.StatusNotFound)
		_, _ = writer.Write([]byte("Not any router match"))
	}
}

func (s *Handlers) Route(method string, pattern string, handlerFunc func(ctx *Context)) {
	//调用辅助方法 组合成key
	key := s.Key(method, pattern)
	//将func赋值给对应的key
	s.handlers[key] = handlerFunc
}

//辅助方法 用于组合method和path
func (h *Handlers) Key(method string, path string) string {
	//中间加一个分割符# 防止误判
	return fmt.Sprintf("%s#%s", method, path)
}

func NewHandlers() *Handlers {
	return &Handlers{handlers: make(map[string]func(c *Context))}
}
